package com.server.service.data;

import java.util.List;

import com.client.service.data.ApporteurDataService;
import com.google.appengine.api.datastore.EntityNotFoundException;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.googlecode.objectify.Key;
import com.server.store.PoolManager;
import com.server.store.data.ApporteurManager;
import com.server.store.data.InterlocuteurManager;
import com.shared.context.User;
import com.shared.data.TypeIData;
import com.shared.model.Apporteur;
import com.shared.model.Interlocuteur;
/**
 * Implémentation du service de gestion des {@link Apporteur}
 * @author queyroi
 *
 */
public class ApporteurDataServiceImpl extends RemoteServiceServlet implements ApporteurDataService{

	public String delete(Apporteur apporteur) throws IllegalArgumentException {
		checkCurrentIsAdministrator();
		checkInput(apporteur);
		((ApporteurManager) PoolManager.get().getDataManager(TypeIData.APPORTEUR)).delete(apporteur);
		return "sucess";
	}

	public List getList() throws IllegalArgumentException {
		checkCurrentIsAdministrator();
		return ((ApporteurManager) PoolManager.get().getDataManager(TypeIData.APPORTEUR)).getList();
	}
	
	public List getListInterlocuteur(Apporteur apporteur) throws IllegalArgumentException {
		checkCurrentIsAdministrator();
		checkInput(apporteur);				
		try {
			return ((ApporteurManager) PoolManager.get().getDataManager(TypeIData.APPORTEUR)).getListInterlocuteurs(apporteur);
		} catch (EntityNotFoundException e) {
			throw new IllegalArgumentException("Pas d'interlocuteur enregistrés");	
		}
	}

	public String save(Apporteur apporteur) throws IllegalArgumentException {
		checkCurrentIsAdministrator();
		checkInput(apporteur);
		((ApporteurManager) PoolManager.get().getDataManager(TypeIData.APPORTEUR)).save(apporteur);
		return "sucess";
	}

	public String update(Apporteur apporteur) throws IllegalArgumentException {
		checkCurrentIsAdministrator();
		checkInput(apporteur);
		((ApporteurManager) PoolManager.get().getDataManager(TypeIData.APPORTEUR)).update(apporteur);
		return "sucess";
	}
	
	public void checkInput(Object obj) throws IllegalArgumentException{
		if(obj==null) throw new IllegalArgumentException("Echec d'enregistrement : vérifier les paramètres");
	}
	
	public void checkCurrentIsAdministrator() throws IllegalArgumentException{
		if(!((User) getThreadLocalRequest().getSession().getAttribute("user")).isAdministrator()) throw new IllegalArgumentException("Seul un administrateur est autorisé à réalisé cette opération");
	}

	public String addInterlocuteur(Apporteur apporteur,	Interlocuteur interlocuteur) throws IllegalArgumentException {
		checkCurrentIsAdministrator();
		checkInput(apporteur);
		checkInput(interlocuteur);
		if(interlocuteur.getKey()==null){
			((InterlocuteurManager) PoolManager.get().getDataManager(TypeIData.INTERLOCUTEUR)).save(interlocuteur);
		}
		apporteur.addInterlocuteur(interlocuteur);
		((ApporteurManager) PoolManager.get().getDataManager(TypeIData.APPORTEUR)).update(apporteur);
		return "sucess";
	}

	public String removeInterlocuteur(Apporteur apporteur,Interlocuteur interlocuteur) throws IllegalArgumentException {
		checkCurrentIsAdministrator();
		checkInput(apporteur);
		checkInput(interlocuteur);
		if(interlocuteur.getKey()==null) throw new IllegalArgumentException("Interlocuteur non enregistré");
		apporteur.getListeKeyInterlocteurs().remove(new Key<Interlocuteur>(Interlocuteur.class, interlocuteur.getKey()));
		((ApporteurManager) PoolManager.get().getDataManager(TypeIData.APPORTEUR)).update(apporteur);
		return "sucess";
	}

	

}
